#ifndef _CHARGE_USER_H_
#define _CHARGE_USER_H_

#include <stdint.h>

#include "ql_main_interface.h"

#ifdef __cplusplus
extern "C" {
#endif

extern ql_para_form_main  gt_para_from_main;

/*
 ***************************适配信息*************************************************
 */
#define CHARGE_SOFTWARE_VERSION "1.0.0"
#define CHARGE_PILE_ID          gt_para_from_main.devNo   //桩编号
#define CHARGE_PILE_TYPE        (gt_para_from_main.type - 1)                       //桩类型 : 0:直流；1:交流
#define CHARGE_GUN_CNT          2 // (gt_para_from_main.gunnum)                       //充电桩枪数量
#define CHARGE_ACCESS_ID        "000000000" // gt_para_from_main.interface_id             //接入id，长度为9字节长度的字符串码，一般为企业组织代码
#define CHARGE_ACCESS_TOKEN     "0000000000000000" //gt_para_from_main.token      //接入token，16字节字符串，请联系运营商通过线下获取
#define CHARGE_SERVER_ADDR      "39.107.77.45"         //云服务器地址
#define CHARGE_SERVER_PORT      20206                   //云服务器端口

#define SUPPORT_LOCK            1                       //地锁，0:不支持，1:支持
#define SUPPORT_CRYPT           0                       //加密传输，0:不加密，1:加密
#define SUPPORT_OFFLINE_CARD    0                       //离线刷卡，0:不支持，1:支持
#if SUPPORT_OFFLINE_CARD
#define BILLS_OF_A_GUN          2                       //支持离线刷卡，一把枪最多保存2个离线刷卡账单
#else
#define BILLS_OF_A_GUN          1                       //不支持离线刷卡，一把枪只保存1个离线账单。充电过程中异常断网会保存账单到本地，请不要修改此定义
#endif

#define IS_DEBUG_HEX            1                       //打印十六进制原始数据，0:不打印，1:打印
#define LOG_LVL_ERROR           0                       //错误
#define LOG_LVL_WARN            1                       //警告
#define LOG_LVL_DEBUG           2                       //调试
#define LOG_OUTPUT_LVL          LOG_LVL_DEBUG           //日志输出等级

/*
 ****************************************************************************************
 */
/*
    设备故障错误码
*/
#define DEV_ERR_3000            0x3000                  //设备自检超时
#define DEV_ERR_3001            0x3001                  //桩离线
#define DEV_ERR_3002            0x3002                  //柜门被打开
#define DEV_ERR_3003            0x3003                  //急停按键被按下 
#define DEV_ERR_3004            0x3004                  //系统风扇故障 
#define DEV_ERR_3005            0x3005                  //模块风扇故障 
#define DEV_ERR_3006            0x3006                  //充电枪未归位告警
#define DEV_ERR_3007            0x3007                  //读卡器异常
#define DEV_ERR_3008            0x3008                  //模块通讯故障 
#define DEV_ERR_3009            0x3009                  //电源模块地址冲突
#define DEV_ERR_300A            0x300A                  //电源模块故障
#define DEV_ERR_300B            0x300B                  //电源模块过温告警 
#define DEV_ERR_300C            0x300C                  //无空闲模块可用（限智能分配功率）
#define DEV_ERR_300D            0x300D                  //电表通讯故障 
#define DEV_ERR_300E            0x300E                  //电表数据异常 
#define DEV_ERR_300F            0x300F                  //输出接触器粘连 
#define DEV_ERR_3010            0x3010                  //直流接触器故障 
#define DEV_ERR_3011            0x3011                  //直流熔断器故障 
#define DEV_ERR_3012            0x3012                  //中间继电器故障 
#define DEV_ERR_3013            0x3013                  //辅助电源故障 
#define DEV_ERR_3014            0x3014                  //绝缘监测故障 
#define DEV_ERR_3015            0x3015                  //泄放回路故障 
#define DEV_ERR_3016            0x3016                  //充电桩过温报警 
#define DEV_ERR_3017            0x3017                  //充电接口过温保护
#define DEV_ERR_3018            0x3018                  //充电接口电子锁故障 
#define DEV_ERR_3019            0x3019                  //液位报警 
#define DEV_ERR_301A            0x301A                  //充电桩内部通讯故障 
#define DEV_ERR_301B            0x301B                  //充电连接故障
#define DEV_ERR_301C            0x301C                  //枪口异常
#define DEV_ERR_301D            0x301D                  //充电桩其他故障
#define DEV_ERR_301E            0x301E                  //地锁锁故障
#define DEV_ERR_301F            0x301F                  //地锁电池耗尽
#define DEV_ERR_3020            0x3020                  //地锁落锁失败
#define DEV_ERR_3021            0x3021                  //指令要求终止的订单号不存在或者和目标充电口当前订单不一致
#define DEV_ERR_3022            0x3022                  //充电桩执行远程功率分配策略失败
#define DEV_ERR_3028            0x3028                  //充电桩设备损坏，请更换充电桩
#define DEV_ERR_3029            0x3029                  //充电桩暂停使用，请更换充电桩
#define DEV_ERR_302A            0x302A                  //交流接触器故障
#define DEV_ERR_302B            0x302B                  //枪头插拔次数预警
#define DEV_ERR_302C            0x302C                  //自检功率分配超时
#define DEV_ERR_302D            0x302D                  //母联粘连故障
#define DEV_ERR_302E            0x302E                  //预充完成超时
#define DEV_ERR_302F            0x302F                  //启动充电超时
#define DEV_ERR_3030            0x3030                  //启动完成应答失败
#define DEV_ERR_3031            0x3031                  //模块开机超时
#define DEV_ERR_3032            0x3032                  //计费控制单元通讯故障 
#define DEV_ERR_3033            0x3033                  //环境监控板通讯故障
#define DEV_ERR_3034            0x3034                  //空调通讯故障 
#define DEV_ERR_3035            0x3035                  //无源开出盒通讯故障 
#define DEV_ERR_3036            0x3036                  //无源开入盒通讯故障 
#define DEV_ERR_3037            0x3037                  //绝缘采样盒通讯故障 
#define DEV_ERR_3038            0x3038                  //直流采样盒通讯故障 
#define DEV_ERR_3039            0x3039                  //导引板通讯故障 
#define DEV_ERR_303A            0x303A                  //灯板通讯故障 
#define DEV_ERR_3044	        0x3044                  // 直流充电主控模块与功率控制模块通信超时（仅直流桩使用）
/*
    电源故障错误码
*/
#define POWER_ERR_4000          0x4000                  //输入电源故障(过 压、过流、欠压，跳闸) 
#define POWER_ERR_4001          0x4001                  //输出电压过压故障
#define POWER_ERR_4002          0x4002                  //输出电压过流故障 
#define POWER_ERR_4003          0x4003                  //输出电压欠压故障 
#define POWER_ERR_4004          0x4004                  //输出短路故障 
#define POWER_ERR_4005          0x4005                  //交流断路器故障 
#define POWER_ERR_4006          0x4006                  //继电器外侧电压大于10v
#define POWER_ERR_4007          0x4007                  //检测点电压检测故障
#define POWER_ERR_4008          0x4008                  //桩群电容量超过额定限制
#define POWER_ERR_4009          0x4009                  //输入缺相报警
#define POWER_ERR_400A          0x400A                  //漏电保护 
#define POWER_ERR_400B          0x400B                  //地线报警 
#define POWER_ERR_400C          0x400C                  //防雷报警 
#define POWER_ERR_400D          0x400D                  //其他电源故障
#define POWER_ERR_400E          0x400E                  //车/桩电压异常
#define POWER_ERR_400F          0x400F                  //模块保护 
#define POWER_ERR_4010          0x4010                  //三相不平衡
#define POWER_ERR_4011          0x4011                  //交流输入过压
#define POWER_ERR_4012          0x4012                  //交流输入欠压
/*
    车辆故障错误码
*/
#define CAR_ERR_5000            0x5000                  //BMS 通讯异常 
#define CAR_ERR_5001            0x5001                  //BCP 充电参数配置报文超时 
#define CAR_ERR_5002            0x5002                  //BRO 充电准备就绪报文超时 
#define CAR_ERR_5003            0x5003                  //BCS 电池充电状态报文超时
#define CAR_ERR_5004            0x5004                  //BCL 电池充电需求报文超时 
#define CAR_ERR_5005            0x5005                  //BST 中止充电报文超时
#define CAR_ERR_5006            0x5006                  //BSD 充电统计数据报文超时
#define CAR_ERR_5007            0x5007                  //BSM 动力蓄电池状态报文超时 
#define CAR_ERR_5008            0x5008                  //BRO 重大故障停止充电
#define CAR_ERR_5009            0x5009                  //BHM 桩的输出能力不匹配
#define CAR_ERR_500A            0x500A                  //BRM 车辆辨识报文超时 
#define CAR_ERR_500B            0x500B                  //BEM 充电错误报文超时 
#define CAR_ERR_500C            0x500C                  //BMS 需求电压过低/过高 
#define CAR_ERR_500D            0x500D                  //BMS 绝缘故障 
#define CAR_ERR_500E            0x500E                  //BMS 元件过温 
#define CAR_ERR_500F            0x500F                  //BMS 电压过高 
#define CAR_ERR_5010            0x5010                  //BMS 预充电压不匹配 
#define CAR_ERR_5011            0x5011                  //BMS其他故障
#define CAR_ERR_5012            0x5012                  //单体动力蓄电池电压过高 
#define CAR_ERR_5013            0x5013                  //单体动力蓄电池电压过低
#define CAR_ERR_5014            0x5014                  //整车动力蓄电池荷电状态SOC过高 
#define CAR_ERR_5015            0x5015                  //整车动力蓄电池荷电状态SOC过低
#define CAR_ERR_5016            0x5016                  //动力蓄电池充电过流
#define CAR_ERR_5017            0x5017                  //动力蓄电池温度过高
#define CAR_ERR_5018            0x5018                  //动力蓄电池绝缘故障
#define CAR_ERR_5019            0x5019                  //动力蓄电池连接器故障
#define CAR_ERR_501A            0x501A                  //电池反接
#define CAR_ERR_501B            0x501B                  //电池欠压
#define CAR_ERR_501C            0x501C                  //电池电压异常 
#define CAR_ERR_501D            0x501D                  //CRO 充电桩输出就绪超时 
#define CAR_ERR_501E            0x501E                  //CCS 充电桩状态报文超时 
#define CAR_ERR_501F            0x501F                  //CST 充电桩终止充电报文超时 
#define CAR_ERR_5020            0x5020                  //CSD 充电统计数据报文超时 
#define CAR_ERR_5021            0x5021                  //车辆电流不匹配
#define CAR_ERR_5022            0x5022                  //车辆电量无法传送
#define CAR_ERR_5023            0x5023                  //车辆占位超时
#define CAR_ERR_5024            0x5024                  //新老国标探测超时，此为车辆故障

#define CAR_ERR_5026            0x5026                  //BMS充电连接器故障，车辆故障
#define CAR_ERR_5027            0x5027                  //BMS高压继电器故障，车辆故障
#define CAR_ERR_502C            0x502C                  //车辆BCP报文和实际电压不符，车辆故障
#define CAR_ERR_502D            0x502D                  //预充阶段调压失败
#define CAR_ERR_502E            0x502E                  //预充阶段等待BCL和BCS超时
#define CAR_ERR_5031            0x5031                  //BST绝缘故障
#define CAR_ERR_5032            0x5032                  //BST连接器过温
#define CAR_ERR_5033            0x5033                  //BST元件过温
#define CAR_ERR_5034            0x5034                  //BST连接器故障
#define CAR_ERR_5035            0x5035                  //BST电池组过温
#define CAR_ERR_5036            0x5036                  //BST其他故障
#define CAR_ERR_5037            0x5037                  //BST检测点2电压检测故障
#define CAR_ERR_5038            0x5038                  //BST高压继电器故障
#define CAR_ERR_5039            0x5039                  //BST电流过大
#define CAR_ERR_503A            0x503A                  //BST电压异常
#define CAR_ERR_503C            0x503C                  //电池最高允许充电电压小于充电机最小输出电压
#define CAR_ERR_503D            0x503D                  //启动充电前直流输出接触器外侧电压小于充电机最小输出电压
#define CAR_ERR_503F            0x503F                  // 电池端电压大于电池最高允许充电电压
#define CAR_ERR_5040            0x5040                  // BRM 报文数据项异常
#define CAR_ERR_5041            0x5041                  // BCP 报文数据项异常（报文数据长度错误，电池当前电压越限，其他数据项错误）
#define CAR_ERR_5042            0x5042                  //BRO 报文（0x00）接收超时
#define CAR_ERR_5043            0x5043                  //BRO 报文（0xAA）接收超时
#define CAR_ERR_502A			0x502A

#define PILE_ERR_6014            0x6014                  //并联接触器拒动/误动故障



typedef struct
{
    uint16_t param_1;
    uint16_t param_2;
} param_combin_t;//组合参数

typedef struct
{
    uint16_t param_8;//默认5 单位0.1V 充电桩预充阶段测量车辆电池电压值与BCP报文中“整车动力蓄电池当前电池电压”差异绝对值大指定电压数值时则停止充电启动流程
    uint16_t param_9;//默认420 单位0.01V 充电阶段，如果电池是三元锂电池，持续监测BCS/BMV报文中“最高单体动力蓄电池电压”，若超过指定电压数值则立即停止充电
    uint16_t param_10;//默认300 单位1mv 充电阶段，若电池类型为三元锂电池，持续监测充电过程中三元锂电池中单体最高电压与最低电池差，若大于指定电压数值且持续10s则认为电芯不均衡严重需告警
    uint16_t param_11;//默认10 单位秒 充电阶段，持续监测BSM报文中的“最高动力蓄电池温度”是否超过BCP报文中的“最高允许温度”，若是且持续N秒则立即停止充电
    param_combin_t param_12;//参数1默认10 单位0.1V，参数2默认1 单位min 充电阶段，BCS报文中“充电电压测量值”和充电机直流电表电压测量值差值绝对值超过nV并持续N min则停止充电
    param_combin_t param_13;//参数1默认10 单位0.1V，参数2默认1 单位min 充电阶段，BCS报文中“充电电压测量值”和充电机高压板测量值差异绝对值超过nV并持续Nmin则停止充电
    param_combin_t param_14;//参数1默认10 单位0.1V，参数2默认1 单位min 充电阶段，充电机直流电表电压测量值和充电机高压板测量值差异绝对值超过nV并持续Nmin则停止充电
    uint16_t param_15;//默认1 单位秒 充电阶段，BCS报文中“充电电流测量值”与充电桩输出电流测量值(>=30A时)之差绝对值超过1%并持续N秒则停止充电
    uint16_t param_16;//默认1 单位秒 充电阶段，BCS报文中“充电电流测量值”与充电桩输出电流测量值（<30A时）之差绝对值超过0.3A并持续Ns则停止充电
    uint16_t param_17;//默认105 单位0.01倍 充电阶段，当充电电量（从直流电表获取）超过“总能量*(1-初始SOC)*N”时停止充电
    uint16_t param_18;//默认5 单位分钟min 充电阶段，起充SOC<50%，充电过程中BCS数据"当前荷电状态SOC"保持不变超过设定的时间中止充电
    uint16_t param_19;//默认5 单位分钟min 充电阶段，起充SOC<50%，充电过程中BCS数据"充电电压测量值"保持不变超过设定的时间中止充电
    uint16_t param_20;//默认5 单位分钟min 充电阶段，起充SOC<50%，充电过程中BCS数据"充电电流测量值"保持不变超过设定的时间中止充电
    uint16_t param_21;//默认5 单位分钟min 充电阶段，起充SOC<50%，充电过程中BCS数据"最高单体动力蓄电池电压"保持不变超过设定的时间中止充电。
    uint16_t param_22;//默认5 单位分钟min 充电阶段，起充SOC<50%，充电过程中BSM数据"最高动力蓄电池温度"保持不变超过设定的时间中止充电
    uint16_t param_23;//默认50%，精确到1% 上述五项(序号21-25)设置中的SOC百分比
    uint16_t param_24;//默认85 单位℃ 充电阶段，充电连接装置温度超过N℃则开始降功率输出，当温度下降到安全阈值则开始增加输出功率 (充电枪过温)
    param_combin_t param_25;//参数1默认100 单位℃ ，参数2默认30 单位秒，充电阶段，当充电连接装置温度超过N℃且持续30s则停止充电；
    uint16_t param_26;//默认5 单位0.1℃/min 充电阶段，充电过程中持续监测并计算动力蓄电池温升速率，若温速率大于N℃/1min则立即停止充电
    uint16_t param_27;//默认10 单位1V 充电阶段，在绝缘检测阶段通过检测熔断器前后两端的电压，压差超过nV认为是熔断器断路异常或者直接采用带反馈信号的熔断器，一旦检测到熔断器断路则告警且中止充电流程。
    uint16_t param_28;//默认36 单位1V 充电阶段，一把枪启动充电时，检验别的未充电枪电压若高于nV则中止充电流程。
    uint16_t param_29;//默认10 单位秒 充电阶段，持续监测BMT报文中温度最高值是否超过BCP报文中“最高允许温度”，若是且持续N秒则立即停止充电；
    uint16_t param_30;//默认50 单位℃ 充电阶段，若BSM报文中电池组温度超过N℃则停止充电
    uint16_t param_31;//默认50 单位℃ 充电阶段，若BMT报文中电池组温度超过N℃则停止充电
} param_group_t; //参数组

typedef struct
{
    uint16_t                    rated_voltage;          //额定输出电压
    uint16_t                    rated_current;          //额定输出电流
    uint16_t                    max_voltage;            //最高充电电压
    uint16_t                    max_current;            //最大充电电流
    uint16_t                    max_power;              //最大充电功率
    uint16_t                    min_power;              //最小充电功率
    uint16_t                    rated_power;            //额定充电功率
    uint8_t                     temperature;            //环境温度
    uint8_t                     humidity;               //环境湿度
    param_group_t               param_group;            //参数组
} user_pile_t;

typedef enum GUN_STATE
{
    GUN_STATE_IDLE              = 0,                    //充电枪未插在车上，可能挂在桩上，也可能未挂在桩上。此时该枪可被远程预约
    GUN_STATE_READY             = 1,                    //充电枪已插入待充电车上，并且读取到了车辆信息
    GUN_STATE_CHARGING          = 2,                    //充电桩正在给车辆充电
    GUN_STATE_CHARGE_END        = 3,                    //充电结束，并且充电枪仍插在车上
    GUN_STATE_FAULT             = 4,                    //故障
} GUN_STATE_t;

#define QR_CODE_LEN             128
typedef struct
{
    uint8_t                     temperature;            //枪线温度
    uint16_t                    voltage;                //输出电压
    int16_t                     current;                //输出电流
    uint8_t                     battery_max_temp;       //电池组最高温度
    uint8_t                     battery_min_temp;       //电池组最低温度
    uint8_t                     soc;                    //SOC
    uint16_t                    remain_charge_time;     //剩余充电时间，单位:分，当剩余充电时间为0时，结束计费，生成账单
    uint32_t                    current_charge_kwh;     //当前电表度数，单位:0.0001度
    uint32_t                    lose_charge_kwh;        //计损总度数，单位:0.0001度
    uint8_t                     qr_code[QR_CODE_LEN];//充电枪二维码
} user_gun_t;

#define BRM_VERSION_LEN             3
#define BRM_BATT_SUP_LEN            4
#define BRM_BATT_DATE_LEN           4
#define BRM_VIN_LEN                 17
#define BRM_BMS_SOFT_VER_LEN        8

typedef struct
{
    uint8_t  brm_bms_connect_version[BRM_VERSION_LEN];          //BRM-BMS通讯协议版本号
    uint8_t  brm_battery_type;                                  //电池类型
    uint16_t brm_battery_rated_capacity;                        //整车动力蓄电池系统额定容量
    uint16_t brm_battery_volt;                                  //整车动力蓄电池系统额定总电压
    uint8_t  brm_battery_supplier[BRM_BATT_SUP_LEN];            //BRM电池生产厂商
    uint16_t brm_battery_no;                                    //电池组序号
    uint8_t  brm_battery_produce_date[BRM_BATT_DATE_LEN];       //BRM-电池组生产日期：第1,2字节表示年,3字节表示月,4字节表示日
    uint32_t brm_battery_charge_count;                          //电池组充电次数
    uint8_t  brm_battery_property_id;                           //电池组产权标识
    uint8_t  brm_bms_software_version[BRM_BMS_SOFT_VER_LEN];    //BMS软件版本号
    uint8_t  brm_vin[BRM_VIN_LEN];                              //车辆识别码vin
    uint16_t bcp_max_voltage;                                   //单体动力蓄电池最高允许充电电压
    uint16_t bcp_max_current;                                   //最高允许充电电流
    uint16_t bcp_max_power;                                     //动力蓄电池标称总能量
    uint16_t bcp_total_voltage;                                 //最高允许充电总电压
    uint8_t  bcp_max_temperature;                               //最高允许温度
    uint16_t bcp_battery_soc;                                   //整车动力蓄电池荷电状态(soc)
    uint16_t bcp_battery_soc_current_voltage;                   //整车动力蓄电池当前电池电压
    uint8_t  bro_bms_is_ready;                                  //BRO-BMS是否充电准备好
    uint8_t  cro_is_ready;                                      //CRO-充电机是否充电准备好
    uint16_t bcl_voltage_need;                                  //BCL电压需求
    uint16_t bcl_current_need;                                  //BCL电流需求
    uint8_t  bcl_charge_mode;                                   //BCL充电模式
    uint16_t bcs_test_voltage;                                  //BCS充电电压测量值
    uint16_t bcs_test_current;                                  //BCS充电电流测量值
    uint16_t bcs_max_single_voltage_and_no;                     //BCS最高单体动力蓄电池电压及组号
    uint8_t  bcs_current_soc;                                   //BCS当前荷电状态soc%
    uint16_t bcs_charge_time_left;                              //BCS估算剩余充电时间
    uint8_t  bsm_max_single_voltage_and_no;                     //BSM-最高单体动力蓄电池电压所在编号
    uint8_t  bsm_max_temperature;                               //BSM最高动力蓄电池温度
    uint8_t  bsm_max_temperature_check_no;                      //BSM-最高温度检测点编号
    uint8_t  bsm_min_temperature;                               //BSM最低动力蓄电池温度
    uint8_t  bsm_min_temperature_check_no;                      //BSM-最低动力蓄电池温度检测点编号
    uint8_t  bsm_voltage_too_high_or_too_low;                   //BSM-单体动力蓄电池电压过高或过低
    uint8_t  bsm_car_battery_soc_too_high_or_too_low;           //BSM-整车动力蓄电池荷电状态soc过高或过低
    uint8_t  bsm_car_battery_charge_over_current;               //BSM-动力蓄电池充电过电流
    uint8_t  bsm_battery_temperature_too_high;                  //BSM-动力蓄电池温度过高
    uint8_t  bsm_battery_insulation_state;                      //BSM-动力蓄电池绝缘状态
    uint8_t  bsm_battery_connect_state;                         //BSM-动力蓄电池组输出连接器连接状态
    uint8_t  bsm_allow_charge;                                  //BSM-充电允许
    uint8_t  bsd_stop_soc;                                      //BSD-终止荷电状态soc
    uint16_t bsd_battery_low_voltage;                           //BSD-动力蓄电池单体最低电压
    uint16_t bsd_battery_high_voltage;                          //BSD-动力蓄电池单体最高电压
    uint8_t  bsd_battery_low_temperature;                       //BSD-动力蓄电池最低温度
    uint8_t  bsd_battery_high_temperature;                      //BSD-动力蓄电池最高温度
    uint8_t  bem_error_spn2560_00;                              //BEM-接收SPN2560=0x00的充电桩辨识报文超时
    uint8_t  bem_error_spn2560_aa;                              //BEM-接收SPN2560=0xaa的充电桩辨识报文超时
    uint8_t  bem_error_time_sync;                               //BEM-接收充电桩的时间同步和最大输出能力报文超时
    uint8_t  bem_error_ready_to_charge;                         //BEM-接收充电桩完成充电准备报文超时
    uint8_t  bem_error_receive_status;                          //BEM-接收充电桩充电状态报文超时
    uint8_t  bem_error_receive_stop;                            //BEM-接收充电桩终止充电报文超时
    uint8_t  bem_error_receive_statistics;                      //BEM-接收充电桩充电统计报文超时
    uint8_t  bem_error_other;                                   //BEM-其他

    //中止BMS-CST数据，充电机中止充电
    uint8_t  cst_stop_reason;                                   //CST - 充电机中止原因
    uint16_t cst_fault_reason;                                  //CST - 中止充电故障原因
    uint8_t  cst_error_reason;                                  //CST - 中止充电错误原因

    //中止BMS-BST数据,BMS中止充电
    uint8_t  bst_stop_reason;                                   //BST - 充电机中止原因
    uint16_t bst_fault_reason;                                  //BST - 中止充电故障原因
    uint8_t  bst_error_reason;                                  //BST - 中止充电错误原因
} user_bms_t;

typedef enum LOCK_STATE
{
    LOCK_STATE_RISE,                                    //升起
    LOCK_STATE_FALL,                                    //降落
    LOCK_STATE_SHELTER,                                 //遮挡
    LOCK_STATE_UNKNOW,                                  //未知
} LOCK_STATE_t;

typedef struct
{
    uint8_t      id;                                    //枪号
    LOCK_STATE_t state;                                 //状态
    uint8_t      battery;                               //电量
} user_lock_t;

// 启动，停止充电 失败原因信息/ 启动停止充电 原因 2021-07-04 
typedef struct 
{
	u8  gun_id;	// 0~7, 枪序号
	u8  reason;	// 启动失败故障原因类型、停止原因类型、故障原因类型
	u16 detail_code;	// 具体故障码，故障原因类型使用，
}t_operate_reason;


extern user_gun_t g_user_gun[CHARGE_GUN_CNT];
extern user_bms_t g_user_bms[CHARGE_GUN_CNT];
extern user_lock_t g_user_lock[CHARGE_GUN_CNT];
extern user_pile_t g_user_pile;

/*****************************************************************************
函数名称 : user_hardware_start_charge
功能描述 : 操作硬件开启充电
传入参数 : gun_id     : 枪号
传出参数 : 无
返回参数 : 0 : 硬件开启充电成功
                     错误码: 无法开启充电，参考交互协议，对错误码进行赋值
*****************************************************************************/
uint16_t user_hardware_start_charge(uint8_t gun_id);

// 根据停止码获取停止原因 
u8 get_stop_reason_by_fee(uint16_t stop_code);

/*****************************************************************************
函数名称 : user_hardware_stop_charge
功能描述 : 操作硬件停止充电
传入参数 : gun_id     : 枪号
传出参数 : 无
返回参数 : 0 : 硬件停止充电成功
                     错误码: 无法停止充电，参考交互协议，对错误码进行赋值
*****************************************************************************/
uint16_t user_hardware_stop_charge(uint8_t gun_id);

/*****************************************************************************
函数名称 : user_cb_start_charging
功能描述 : 开启充电，SDK收到0x26指令或刷卡时调用该函数
传入参数 : gun_id     : 枪号
传出参数 : err : 0 : 开启充电执行成功
                     错误码: 无法开启充电，参考交互协议，对错误码进行赋值
返回参数 : 无
*****************************************************************************/
void user_cb_start_charging(uint8_t gun_id, uint16_t *err);

/*****************************************************************************
函数名称 : user_cb_stop_charging
功能描述 : 停止充电，SDK收到0x28指令或刷卡或达到充电条件时调用该函数
传入参数 : gun_id     : 枪号
传出参数 : err : 0 : 开关命令执行成功
                     错误码: 无法停止充电，参考交互协议，对错误码进行赋值
返回参数 : 无
*****************************************************************************/
void user_cb_stop_charging(uint8_t gun_id, uint16_t *err);

/*****************************************************************************
函数名称 : user_cb_lock_switch
功能描述 : 控制地锁开关，SDK收到0x91指令时会调用该函数
传入参数 : lock_id  : 地锁号
                        _switch : 0 : 解锁
                                      1 : 上锁
传出参数 : err : 0 : 开关命令执行成功
                     错误码: 参考交互协议，对错误码进行赋值
返回参数 : 无
*****************************************************************************/
void user_cb_lock_switch(uint8_t lock_id, uint8_t _switch, uint8_t *err);

typedef struct os_time
{
    int8_t  sec;
    int8_t  min;
    int8_t  hour;
    int8_t  day;
    int8_t  mon;
    int16_t year;
    int8_t  week;
} os_time_t;

/*****************************************************************************
函数名称 : user_cb_set_time
功能描述 : 同步当前时间，SDK收到0xb0指令时会调用该函数
传入参数 : timestamp : 北京时间时间戳
                         time : 实时时间结构体
传出参数 : 无
返回参数 : 无
*****************************************************************************/
void user_cb_set_time(uint32_t timestamp, os_time_t *time);

#define CARD_AUTH_OK     0
#define CARD_AUTH_FAIL   -1

/*****************************************************************************
函数名称 : user_cb_card_auth
功能描述 : 离线刷卡鉴权，如支持离线刷卡则需实现该函数。需要对卡号进行权限验证，并将卡余额赋值
传入参数 : card_id : 卡号
传出参数 : balance : 卡余额
返回参数 : CARD_AUTH_OK : 鉴权成功
                        CARD_AUTH_FAIL : 鉴权失败
*****************************************************************************/
int32_t user_cb_card_auth(const uint8_t card_id[8], uint32_t *balance);

/*****************************************************************************
函数名称 : user_cb_connected
功能描述 : 充电桩连接云端成功
传入参数 : timestamp : 连接成功实时时间戳
传出参数 : 无
返回参数 : 无
*****************************************************************************/
void user_cb_connected(uint32_t timestamp);

/*****************************************************************************
函数名称 : user_cb_dissconnected
功能描述 : 充电桩连接断开
传入参数 : timestamp : 断开时间实时时间戳
传出参数 : 无
返回参数 : 无
*****************************************************************************/
void user_cb_dissconnected(uint32_t timestamp);

/*****************************************************************************
函数名称 : user_cb_reboot_pile
功能描述 : 重启充电桩，SDK收到0x03指令时会调用该函数
传入参数 : cmd : 0 : 重启
                                 1 : 关机
传出参数 : err : 0 : 准备重启
                     错误码: 无法重启，参考交互协议，对错误码进行赋值
返回参数 : 无
*****************************************************************************/
void user_cb_reboot_pile(uint8_t cmd, uint16_t *err);

/*****************************************************************************
函数名称 : user_write_data
功能描述 : 用户写数据接口
传入参数 : data     : 数据
          data_len : 数据长度
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t user_write_data(const void *data, uint32_t data_len);

/*****************************************************************************
函数名称 : user_read_data
功能描述 : 用户读取数据接口
传入参数 : data     : 数据
          data_len : 数据长度
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t user_read_data(void *data, uint32_t data_len);

/*****************************************************************************
函数名称 : user_create_download_file
功能描述 : 创建下载的文件
传入参数 : file_name : 文件名字
返回参数 : 0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t user_create_download_file(char *file_name);

/*****************************************************************************
函数名称 : user_write_download_file_data
功能描述 : 写入下载的数据到文件
传入参数 : file_name : 文件名字
传入参数 : offset : 偏移地址
传入参数 : data : 保存的数据
传入参数   data_len : 数据长度
返回参数 : 0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t user_write_download_file_data(char *file_name, uint32_t offset, void *data, uint16_t data_len);

/*****************************************************************************
函数名称 : user_download_file_done
功能描述 : 下载完成
传入参数 : file_name : 文件名字
传入参数 : state : 是否成功  0：成功 1：失败
返回参数 : 0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t user_download_file_done(char *file_name, uint8_t state);

/*****************************************************************************
函数名称 : convert_temperature
功能描述 : 将温度按一定偏移量进行转换
传入参数 : temperature : 转换前温度值
传出参数 : 无
返回参数 : 转换后温度值
*****************************************************************************/
uint8_t convert_temperature(int8_t temperature);

/*****************************************************************************
函数名称 : convert_electric
功能描述 : 将浮点类型的电气参数按一定倍率转换为整型，请参考实例及通信协议文档
传入参数 : elec_param : 浮点型电气参数
传出参数 : 无
返回参数 : 整型参数
*****************************************************************************/
uint16_t convert_electric(float elec_param);

/*****************************************************************************
函数名称 : convert_bms_current
功能描述 : 将浮点类型的BMS电流按一定倍率转换为整型，请参考实例及通信协议文档
传入参数 : current : 浮点型电流
传出参数 : 无
返回参数 : 整型电流
*****************************************************************************/
uint16_t convert_bms_current(float current);

/*****************************************************************************
函数名称 : convert_bms_voltage
功能描述 : 将浮点类型的BMS电压按一定倍率转换为整型，请参考实例及通信协议文档
传入参数 : voltage : 浮点型电压
传出参数 : 无
返回参数 : 整型电压
*****************************************************************************/
uint16_t convert_bms_voltage(float voltage);

/*****************************************************************************
函数名称 : charge_get_gun_state
功能描述 : 获取枪状态
传入参数 : gun_id     : 枪号
传出参数 : 无
返回参数 : 枪状态
*****************************************************************************/
int32_t charge_get_gun_state(uint8_t gun_id);

/*****************************************************************************
函数名称 : charge_set_gun_state
功能描述 : 设置枪的状态
传入参数 : gun_id     : 枪号
                        gun_state : 枪状态
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_set_gun_state(uint8_t gun_id, GUN_STATE_t gun_state);

/*****************************************************************************
函数名称 : charge_start_by_card
功能描述 : 刷卡启动充电
传入参数 : gun_id     : 枪号
                        card_id     : 卡号
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_start_by_card(uint8_t gun_id, const uint8_t card_id[8]);

/*****************************************************************************
函数名称 : charge_stop_by_card
功能描述 : 刷卡触发停止充电
传入参数 : gun_id     : 枪号
                        card_id     : 卡号
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_stop_by_card(uint8_t gun_id, const uint8_t card_id[8]);

/*****************************************************************************
函数名称 : charge_start_by_vin
功能描述 : VIN码启动充电
传入参数 : gun_id     : 枪号
        : vin        ：VIN码
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_start_by_vin(uint8_t gun_id, const uint8_t *vin);

/*****************************************************************************
函数名称 : charge_stop_by_vin
功能描述 : VIN码停止充电
传入参数 : gun_id     : 枪号
        :  vin       : vin码
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_stop_by_vin(uint8_t gun_id, const uint8_t *vin);

/*****************************************************************************
函数名称 : charge_start_by_app_account
功能描述 : APP账号启动充电
传入参数 : gun_id               : 枪号
        : app_account           ：APP账号
        ：app_password          : APP账号密码
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_start_by_app_account(uint8_t gun_id, const uint8_t *app_account, const uint8_t *app_password);

/*****************************************************************************
函数名称 : charge_stop_by_app_account
功能描述 : APP账号停止充电
传入参数 : gun_id               : 枪号
        : app_account           ：APP账号
        ：app_password          : APP账号密码
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_stop_by_app_account(uint8_t gun_id, const uint8_t *app_account, const uint8_t *app_password);

/*****************************************************************************
函数名称 : charge_press_emerg_btn
功能描述 : 急停按键被按下
传入参数 : gun_id     : 枪号
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_press_emerg_btn(uint8_t gun_id);

/*****************************************************************************
函数名称 : charge_pull_gun
功能描述 : 将充电枪从车上拔下时调用
传入参数 : gun_id     : 枪号
传出参数 : 无
返回参数 : 0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_pull_gun(uint8_t gun_id);

/*****************************************************************************
函数名称 : charge_fault_occur
功能描述 : 故障上报
传入参数 : gun_id     : 枪号
          fault : 故障码
传出参数 : 无
返回参数 : 0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_fault_occur(uint8_t gun_id, uint16_t fault_code);

int32_t charge_vehicle_fault_occur(uint8_t gun_id, uint16_t fault_code);

int32_t charge_vehicle_auto_stop_occur(uint8_t gun_id, uint16_t stop_code);

int32_t charge_fault_upload(uint8_t gun_id, uint16_t fault_code);

void set_update_bill_flag(u8 gun_id, u8 val);
/*****************************************************************************
函数名称 : charge_fault_recover
功能描述 : 故障恢复
传入参数 : gun_id     : 枪号
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_fault_recover(uint8_t gun_id);

/*****************************************************************************
函数名称 : charge_run
功能描述 : 初始化设备与云端交互的上下文环境，与云端会建立长连接
传入参数 : pile     : 充电桩实时信息
          u_gun : 充电枪实时信息
          lock : 地锁实时信息
传出参数 : 无
返回参数 :  0 : 成功
           -1 : 失败
*****************************************************************************/
int32_t charge_run(user_pile_t *pile, user_gun_t *u_gun, user_bms_t *bms, user_lock_t *lock);

//更新地锁状态信息
void user_update_lock(uint8_t lock_id, LOCK_STATE_t lock_state);

void user_update_bms_charging_by_start_MX(uint8_t gun_id);

void user_update_bms_charging_by_end_MX(uint8_t gun_id);

void user_update_lock(uint8_t lock_id, LOCK_STATE_t lock_state);

int32_t charge_set_gun_state(uint8_t gun_id, GUN_STATE_t gun_state);

void user_update_gun_data(uint8_t gun_id);

void user_update_gun_data_by_yc(uint8_t gun_id,  void *p_data);

void user_update_bms_config(uint8_t gun_id);

void user_update_bms_charging(uint8_t gun_id);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif
